package cn.yx.common.core.util.date;

import cn.yx.common.core.enums.date.DatePatternEnum;

import java.sql.Timestamp;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;

/**
 * <p>时间格式化工具</p>
 *
 * @author Wgssmart
 */
public final class DateFormatUtil {

    private DateFormatUtil() {
    }

    /**
     * 通过指定格式把Calendar格式化
     *
     * @param cal     Calendar类的实例指定的时间
     * @param pattern 时间格式
     * @return 按时间格式格式化后的时间字符串
     */
    @Deprecated
    public static String format(Calendar cal, String pattern) {
        return DateUtil.localDateTime(cal).format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 通过指定格式把豪秒值格式化
     *
     * @param millis  时间毫秒值
     * @param pattern 时间格式
     * @return 按时间格式格式化后的时间字符串
     */
    public static String format(long millis, String pattern) {
        return DateUtil.localDateTime(millis).format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 通过指定格式把Date格式化
     *
     * @param date    Date实例
     * @param pattern 时间格式
     * @return 按时间格式格式化后的时间字符串
     */
    public static String format(Date date, String pattern) {
        return DateUtil.localDateTime(date).format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 通过指定格式把Timestamp格式化
     *
     * @param timestamp Timestamp实例
     * @param pattern   时间格式
     * @return 按时间格式格式化后的时间字符串
     */
    public static String format(Timestamp timestamp, String pattern) {
        return DateUtil.localDateTime(timestamp).format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 针对JDK1.8提供的新的时间日期类的格式化
     *
     * @param localDateTime LocalDateTime实例，JDK1.8中提供
     * @param pattern       时间格式
     * @return 按时间格式格式化后的时间字符串
     */
    public static String format(LocalDateTime localDateTime, String pattern) {
        return localDateTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 针对JDK1.8提供的新的时间日期类的格式化
     *
     * @param localTime LocalTime实例，JDK1.8中提供
     * @param pattern   时间格式
     * @return 按时间格式格式化后的时间字符串
     */
    public static String format(LocalTime localTime, String pattern) {
        return localTime.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 通过指定格式把Instant格式化
     *
     * @param instant Instant实例
     * @param pattern 时间格式
     * @return 按时间格式格式化后的时间字符串
     */
    public static String format(Instant instant, String pattern) {
        return format(DateUtil.localDateTime(instant), pattern);
    }

    /**
     * 根据默认的格式把Date实例格式化
     *
     * @param date Date实例
     * @return 按默认的时间格式格式化后的时间字符串
     */
    public static String format(Date date) {
        return format(date, DatePatternEnum.DATETIME.getValue());
    }

    /**
     * 根据默认的时间格式把Calendar实例格式化
     *
     * @param cal Calendar类实例
     * @return 按默认的时间格式格式化后的时间字符串
     */
    @Deprecated
    public static String format(Calendar cal) {
        return format(cal, DatePatternEnum.DATETIME.getValue());
    }

    /**
     * 根据默认的时间格式把毫秒值时间格式化
     *
     * @param millis 时间毫秒值
     * @return 按默认的时间格式格式化后的时间字符串
     */
    public static String format(long millis) {
        return format(millis, DatePatternEnum.DATETIME.getValue());
    }

    /**
     * 根据默认的时候格式把LocalDateTime时间格式化
     *
     * @param localDateTime LocalDateTime实例
     * @return 按默认的时间格式格式化后的时间字符串
     */
    public static String format(LocalDateTime localDateTime) {
        return format(localDateTime, DatePatternEnum.DATETIME.getValue());
    }

    /**
     * 根据默认的时候格式把LocalTime时间格式化
     *
     * @param localTime LocalTime实例
     * @return 按默认的时间格式格式化后的时间字符串
     */
    public static String format(LocalTime localTime) {
        return format(localTime, DatePatternEnum.TIME.getValue());
    }

    /**
     * 根据默认的时候格式把Instant时间格式化
     *
     * @param instant Instant实例
     * @return 按默认的时间格式格式化后的时间字符串
     */
    public static String format(Instant instant) {
        return format(instant, DatePatternEnum.DATETIME.getValue());
    }

    /**
     * 根据默认的时间格式把Timestamp格式化
     *
     * @param timestamp Timestamp实例
     * @return 按默认的时间格式格式化后的时间字符串
     */
    public static String format(Timestamp timestamp) {
        return format(timestamp, DatePatternEnum.DATETIME.getValue());
    }

}
